package org.example;

import com.alibaba.fastjson.JSON;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class Client {
    public static void main(String[] args) {
        try {
            // 创建Socket对象，指定服务端的IP地址和端口号
            Socket socket = new Socket("127.0.0.1", Constant.port);

            // 获取输入流和输出流 输入流和输出流是通过socket对象来进行数据传输的。
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

            // 从控制台读取用户输入
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            String nickname ="qzh";
            //发送初始化连接消息
            sendMessage(out,nickname,"Server",ChatMessage.type.登录,"初始化连接服务器");

            while (true) {
                System.out.println("请输入消息或命令，exit为退出，getall为列出当前所在线的用户，getsys为查询服务器状态，getself为查询自身状态");
                System.out.println("sendto xxx with xxx格式为发送私人消息，notice xxx为广播,nick xxx 为设置自身昵称：");
               String message = reader.readLine();
                if (message.startsWith("exit")) {
                    // 如果用户输入 'exit'，发送终止标志给服务端并退出循环
                    sendMessage(out,nickname,"Server",ChatMessage.type.登出,"退出");
                    break;
                }
                if (message.startsWith("getall")) {
                    // 如果用户输入 'exit'，发送终止标志给服务端并退出循环
                    sendMessage(out,nickname,"Server",ChatMessage.type.查询当前在线人员,"");

                }
                if (message.startsWith("getself")) {
                    // 如果用户输入 'exit'，发送终止标志给服务端并退出循环
                    sendMessage(out,nickname,"Server",ChatMessage.type.查看自身状态,"");

                }
                if (message.startsWith("getsys")) {
                    // 如果用户输入 'exit'，发送终止标志给服务端并退出循环
                    sendMessage(out,nickname,"Server",ChatMessage.type.查询当前服务器状态,"退出");

                }
                if (message.startsWith("nick")) {
                    // 如果用户输入 'exit'，发送终止标志给服务端并退出循环
                    String newNickName = message.substring(4,message.length());
                    sendMessage(out,nickname,"Server",ChatMessage.type.设置昵称,newNickName);

                }
                if (message.startsWith("sendto")) {
                    // 如果用户输入 'exit'，发送终止标志给服务端并退出循环
                    sendMessage(out,nickname,"Server",ChatMessage.type.发送私人消息,"测试私人消息，发送自client");

                }
                if (message.startsWith("notice")) {
                    // 如果用户输入 'exit'，发送终止标志给服务端并退出循环
                    sendMessage(out,nickname,"Server",ChatMessage.type.广播,"广播测试消息");

                }

               //  接收服务端的响应并打印
                String response = in.readLine();
                ChatMessage chatMessage =  analyseMessage(response);
                if(chatMessage.getType().equals(ChatMessage.type.普通回应))
                {
                    System.err.println("服务端响应：" + chatMessage.getInformation());
                }
                if(chatMessage.getType().equals(ChatMessage.type.警告回应))
                {
                    System.err.println("服务端警告：" + chatMessage.getInformation());
                }
            }

            // 关闭连接
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void sendMessage(PrintWriter out, String origin, String purpose, ChatMessage.type type, String message) {
        ChatMessage chatMessage = new ChatMessage(type,origin,purpose,message);
        out.println(JSON.toJSON(chatMessage));

    }
    private static ChatMessage analyseMessage(String message) {
        return JSON.parseObject(message,ChatMessage.class);

    }
}